package com.zhuo.boot.config;

import ch.qos.logback.core.db.DBAppenderBase;
import ch.qos.logback.core.db.DBHelper;
import com.zhuo.boot.bean.Car;
import com.zhuo.boot.bean.Pet;
import com.zhuo.boot.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

/**
 * @Configuration  告诉SpringBoot这是一个配置类===配置文件
 * 配置类里面使用@Bean 标注在方法上给容器注册组件，默认是单实例的
 * 配置类本身也是组件
 * @Configuration(proxyBeanMethods = true)  代理对象调用方法，所以SpringBoot总会检查这个组件是否在容器中有，保持组件单实例
 *                proxyBeanMethods = true   那么配置类将不在是代理对象，这个时候多次调用方法则会产生多个对象，不再保持单实例
 *
 * @Import({User.class, DBHelper.class})
 *      给容器中自动创建出这两个类型的组件，
 *      默认组件的名字就是全类名
 *
 * @ImportResource("classpath:beans.xml")   Spring配置文件在SpringBoot项目中一般是不会被加载的，这个注解用于导入Spring的配置文件
 */


@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true)
@ImportResource("classpath:beans.xml")

@EnableConfigurationProperties(Car.class)   //开启Car的属性配置绑定功能，并把组件自动注入到容器中
public class MyConfig {

    /**
     * @Bean 给容器中添加组件，
     *      以方法名作为组件的id，
     *      返回类型就是组件类型，
     *      方法返回的值，就是组件在容器中的实例
     *
     *      外部无论对配置类中的这个组件调用多少次，获取的都是之前注册容器中的单实例对象
     */
    @Bean
    public User user01(){
        return new User("zhangsan",18);
    }

//    @Bean("tom")
//    public Pet tomcatPet(){
//        return new Pet("tomcat");
//    }
}

/**
 * 条件装配：满足Conditional指定的条件，则进行组件注入
 * 如@ConditionalOnBean(name = "tom")：在方法或者类中存在tom这个组件时，才执行方法或类，否则不执行
 */
